/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Control;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.ArrayList;
import javax.swing.table.DefaultTableModel;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

/**
 *
 * @author Zeta
 */
public class GestorGuardarDatosExel
{
    private File archivoAGuardar;
    private DefaultTableModel criterios;
    private DefaultTableModel criteriosXAlternativas;
    private ArrayList<String> nombreCriterios;
    private ArrayList<String> nombreAlternativas;

    public GestorGuardarDatosExel(File aG, DefaultTableModel cr, DefaultTableModel crXAl, ArrayList<String> nCr, ArrayList<String> nAl)
    {
        archivoAGuardar = aG;
        criterios = cr;
        criteriosXAlternativas = crXAl;
        nombreCriterios = nCr;
        nombreAlternativas = nAl;
    }

    public boolean guardarExcel(boolean boolCriteriosXAlternativas) throws Exception
    {
        boolean throwsable = true;
        try
        {
            int cantidadCriterios = criterios.getRowCount();
            int cantidadAlternativas = criteriosXAlternativas.getColumnCount();
            GestorGeneradorExcel generador = new GestorGeneradorExcel(cantidadCriterios, cantidadAlternativas, archivoAGuardar);
            boolean generar = generador.generarExcel(boolCriteriosXAlternativas);
            if (!generar)
            {
                return false;
            }
            HSSFWorkbook wb = new HSSFWorkbook(new FileInputStream(archivoAGuardar));
            HSSFSheet sheet = wb.getSheetAt(0);
            HSSFRow row;
            HSSFCell cell;
            String aux;
            for (int i = 0; i < cantidadCriterios; i++)
            {
                row = sheet.getRow((i + 2));
                for (int j = 0; j < 7; j++)
                {
                    cell = row.getCell((j + 1));
                    if (j == 0)
                    {
                        aux = nombreCriterios.get(i);
                        if (aux.compareTo("") == 0)
                        {
                            continue;
                        }
                        else
                        {
                            cell.setCellValue(aux);
                        }
                    }
                    else
                    {
                        aux = String.valueOf(criterios.getValueAt(i, (j - 1)));
                        if (aux.compareTo("") == 0 || aux.compareTo("null") == 0)
                        {
                            continue;
                        }
                        if (j < 2 || j > 3)
                        {
                            try
                            {
                                double ex = Double.parseDouble(aux);
                                if (ex >= 0)
                                {
                                    cell.setCellValue(ex);
                                }
                                else
                                {
                                    throwsable = false;
                                    throw new Exception("El valor de la celda en la fila " + (i + 1) + " y la columna " + j + " en la tabla de criterios debe ser un número decimal mayor o igual a 0");
                                }
                            }
                            catch (Exception e)
                            {
                                throwsable = false;
                                throw new Exception("El valor de la celda en la fila " + (i + 1) + " y la columna " + j + " en la tabla de criterios debe ser un número decimal mayor o igual a 0");
                            }
                        }
                        else
                        {
                            cell.setCellValue(aux);
                        }
                    }
                }
            }
            if (boolCriteriosXAlternativas)
            {
                for (int i = 0; i < (cantidadCriterios + 1); i++)
                {
                    row = sheet.getRow((i + cantidadCriterios + 3));
                    for (int j = 0; j < (cantidadAlternativas + 1); j++)
                    {
                        cell = row.getCell((j + 1));
                        if (i == 0)
                        {
                            if (j != 0)
                            {
                                aux = nombreAlternativas.get((j - 1));
                                if (aux.compareTo("") == 0)
                                {
                                    continue;
                                }
                                else
                                {
                                    cell.setCellValue(aux);
                                }
                            }
                        }
                        else
                        {
                            if (j == 0)
                            {
                                aux = nombreCriterios.get((i - 1));
                                if (aux.compareTo("") == 0)
                                {
                                    continue;
                                }
                                else
                                {
                                    cell.setCellValue(aux);
                                }
                            }
                            else
                            {
                                aux = String.valueOf(criteriosXAlternativas.getValueAt((i - 1), (j - 1)));
                                if (aux.compareTo("") == 0 || aux.compareTo("null") == 0)
                                {
                                    continue;
                                }
                                try
                                {
                                    double ex = Double.parseDouble(aux);
                                    if (ex >= 0)
                                    {
                                        cell.setCellValue(ex);
                                    }
                                    else
                                    {
                                        throwsable = false;
                                        throw new Exception("El valor de la celda en la fila " + i + " y la columna " + j + " en la tabla de criterios por alternativas debe ser un número decimal mayor o igual a 0");
                                    }
                                }
                                catch (Exception e)
                                {
                                    throwsable = false;
                                    throw new Exception("El valor de la celda en la fila " + i + " y la columna " + j + " en la tabla de criterios por alternativas debe ser un número decimal mayor o igual a 0");
                                }
                            }
                        }
                    }
                }
            }
            else
            {
                for (int i = 0; i < (cantidadAlternativas + 1); i++)
                {
                    row = sheet.getRow((i + cantidadCriterios + 3));
                    for (int j = 0; j < (cantidadCriterios + 1); j++)
                    {
                        cell = row.getCell((j + 1));
                        if (i == 0)
                        {
                            if (j != 0)
                            {
                                aux = nombreCriterios.get((j - 1));
                                if (aux.compareTo("") == 0)
                                {
                                    continue;
                                }
                                else
                                {
                                    cell.setCellValue(aux);
                                }
                            }
                        }
                        else
                        {
                            if (j == 0)
                            {
                                aux = nombreAlternativas.get((i - 1));
                                if (aux.compareTo("") == 0)
                                {
                                    continue;
                                }
                                else
                                {
                                    cell.setCellValue(aux);
                                }
                            }
                            else
                            {
                                aux = String.valueOf(criteriosXAlternativas.getValueAt((j - 1),(i - 1)));
                                if (aux.compareTo("") == 0 || aux.compareTo("null") == 0)
                                {
                                    continue;
                                }
                                try
                                {
                                    double ex = Double.parseDouble(aux);
                                    if (ex >= 0)
                                    {
                                        cell.setCellValue(ex);
                                    }
                                    else
                                    {
                                        throwsable = false;
                                        throw new Exception("El valor de la celda en la fila " + i + " y la columna " + j + " en la tabla de criterios por alternativas debe ser un número decimal mayor o igual a 0");
                                    }
                                }
                                catch (Exception e)
                                {
                                    throwsable = false;
                                    throw new Exception("El valor de la celda en la fila " + i + " y la columna " + j + " en la tabla de criterios por alternativas debe ser un número decimal mayor o igual a 0");
                                }
                            }
                        }
                    }
                }
            }
            FileOutputStream fileOut = new FileOutputStream(archivoAGuardar);
            wb.write(fileOut);
            fileOut.close();
        }
        catch (Exception e)
        {
            archivoAGuardar.delete();
            if (throwsable)
            {
                e.printStackTrace();
                return false;
            }
            else
            {
                throw e;
            }
        }
        return true;
    }
}
